<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件
const API_CODE = [
    'SUCCESS'        => 200,//成功
    'ERROR'          => 2000,//失败
];

/**
 * 统一接口返回数据处理 apiSuccess 成功返回 apiError 错误返回
 * @param string $message
 * @param array $data
 * @param mixed $code
 * @return \think\response\Json
 */
function apiSuccess($data = [],$message='OK',$code = API_CODE['SUCCESS']){
    return json([
        'message'=>$message,
        'code'=>$code,
        'data'=>$data
    ]);
}

function apiError($message='' ,$data = [],$code = API_CODE['ERROR'],$state = 200){
    return json([
        'message'=>$message,
        'code'=>$code,
        'data'=>$data
    ])->code($state);
}

//生成唯一用户标识id
function create_guid() {
    $charid = strtoupper(md5(uniqid(mt_rand(), true)));
    $hyphen = chr(45);//
    $uuid = substr($charid, 0, 8).$hyphen
        .substr($charid, 8, 4).$hyphen
        .substr($charid,12, 4).$hyphen
        .substr($charid,16, 4).$hyphen
        .substr($charid,20,12);
    return $uuid;
}

/**
 * 功能：php完美实现下载远程图片保存到本地
 * 参数：文件url,保存文件目录,保存文件名称，使用的下载方式
 * 当保存文件名称为空时则使用远程文件原来的名称
 * @param $url
 * @param string $save_dir
 * @param string $filename
 * @param int $type
 * @return array
 */
function getImage($url,$save_dir='',$filename='',$type=0){
    if(trim($url)==''){
        return array('file_name'=>'','save_path'=>'','error'=>1);
    }
    if(trim($save_dir)==''){
        $save_dir='./';
    }
    if(trim($filename)==''){//保存文件名
        $ext=strrchr($url,'.');
        if($ext!='.png'&&$ext!='.gif'&&$ext!='.jpg'&&$ext!='.jpeg'){
            return array('file_name'=>'','save_path'=>'','error'=>3);
        }
        $filename=time().$ext;
    }
    if(0!==strrpos($save_dir,'/')){
        $save_dir.='/';
    }
    //创建保存目录
    if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
        return array('file_name'=>'','save_path'=>'','error'=>5);
    }
    //获取远程文件所采用的方法
    if($type){
        $ch=curl_init();
        $timeout=5;
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
        $img=curl_exec($ch);
        curl_close($ch);
    }else{
        ob_start();
        readfile($url);
        $img=ob_get_contents();
        ob_end_clean();
    }
    //$size=strlen($img);
    //文件大小
    $fp2=@fopen($save_dir.$filename,'a');
    fwrite($fp2,$img);
    fclose($fp2);
    unset($img,$url);
    return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}


/**
 * base64图片上传
 * @param $base64_image_content
 * @param string $url
 * @return mixed
 */
function imgBase64($base64_image_content, $url = '')
{


    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {

        // 图片后缀
        $type = $result[2];

        // 保存位置--图片名
        $image_name = onlyNumbers() . "." . $type;
        $imga_url = date('Ymd') . '/' . $image_name;
        $image_url = $url . $imga_url;

        if (!is_dir(dirname($image_url))) {
            mkdir(dirname($image_url));
            chmod(dirname($image_url), 0777);
            umask();
        }
        // 解码
        $decode = base64_decode(str_replace($result[1], '', $base64_image_content));

        if (file_put_contents($image_url, $decode)) {
            $data['code'] = 200;
            $data['imageName'] = $imga_url;
            $data['url'] = $imga_url;
            $data['msg'] = '保存成功！';
        } else {
            $data['code'] = 1;
            $data['imgageName'] = '';
            $data['url'] = '';
            $data['msg'] = '图片保存失败！';
        }


    } else {
        $data['code'] = 1;
        $data['imgageName'] = '';
        $data['url'] = '';
        $data['msg'] = 'base64图片格式有误！';
    }


    return $data;


}

/**
 * 提取字符串中的数字
 * @param string $str
 * @return string
 */
function findNum($str=''){
    $str=trim($str);
    if(empty($str)){
        return '';
    }
    $temp=array('1','2','3','4','5','6','7','8','9','0');
    $result='';
    for($i=0;$i<strlen($str);$i++){
        if(in_array($str[$i],$temp)){
            $result.=$str[$i];
        }
    }
    return $result;
}


/**
 * @param PHP生成随机字符串有可能重复
 * @param $length 随机数长度 generateRandomString(20);
 * @param int $length
 * @return string
 */
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

/**
 * 不重复的数字
 * @return string
 */
function onlyNumbers(){
    return date('His') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

//生成不重复的随机字符串
function randString($len)
{
    $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $string=time();
    for(;$len>=1;$len--)
    {
        $position=rand()%strlen($chars);
        $position2=rand()%strlen($string);
        $string=substr_replace($string,substr($chars,$position,1),$position2,0);
    }
    return $string;
}


/**
 * 生成邀请码
 * @param unitCode
 */
function randString6($unitCode = '', $len = 6)
{
    $arr = ["1", "2", "3", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
    $arrLen = count($arr) - 1;
    for ($i = 0; $i < $len; $i++) {
        $unitCode .= $arr[mt_rand(0, $arrLen)];
    }
    return $unitCode;
}


//生成不重复的随机字符串大写的
function randString8()
{
    $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

    $rand = $code[rand(0,25)]

        .strtoupper(dechex(date('m')))

        .date('d').substr(time(),-5)

        .substr(microtime(),2,5)

        .sprintf('%02d',rand(0,99));

    for(

        $a = md5( $rand, true ),

        $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',

        $d = '',

        $f = 0;

        $f < 8;

        $g = ord( $a[ $f ] ),

        $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],

        $f++

    );

    return  $d;
}


//检测域名格式
function CheckUrl($C_url){
    $str="/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/";
    if (!preg_match($str,$C_url)){
        return false;
    }else{
        return true;
    }
}

//生成唯一商户订单号
function GetOutTradeNo(){
    return date('Ymd').substr
        (implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
}

//获取微信access_token
function _access_token($appid, $secret){
    $appid =$appid;
    $secret = $secret;
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
   $data = json_decode(file_get_contents($url,true),true);
   $access_token = $data['access_token'];
   return $access_token;
}

//获取微信手机号
function _getPhone($access_token, $code){

    function Post($curlPost, $url, $ssl = false)
    {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        if (!$ssl) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        }
        $return_str = curl_exec($curl);
        curl_close($curl);
        return $return_str;
    }

    $url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$access_token;
    $data['code'] = $code;
    $info = Post(json_encode($data),$url);
    $tmpinfo = json_decode($info,true);

    $code = $tmpinfo['errcode'];
    
    $phoneNumber = ""; 
    if($code == '0'){
        $phoneNumber = $tmpinfo['phone_info']['phoneNumber'];
    }



    return $phoneNumber;
}


/**
 * 获取两个时间戳相差月数
 * @param int $time1
 * @param int $time2
 * @return number
 */
function get_diff_months($time1,$time2){
    $months=0;
    $t=0;
    if($time1>$time2){
        $t=$time1;
        $time1=$time2;
        $time2=$t;
    }
    $y1=date('Y',$time1);
    $y2=date('Y',$time2);
    $m1=date('m',$time1);
    $m2=date('m',$time2);
    $months=($y2-$y1)*12+($m2-$m1);
    return $months;
}


/**
 * 校验身份证号是否合法
 * @param string $num 待校验的身份证号
 * @return bool
 */
function isValid(string $num)
{
    //老身份证长度15位，新身份证长度18位
    $length = strlen($num);
    if ($length == 15) { //如果是15位身份证

        //15位身份证没有字母
        if (!is_numeric($num)) {
            return false;
        }
        // 省市县（6位）
        $areaNum = substr($num, 0, 6);
        // 出生年月（6位）
        $dateNum = substr($num, 6, 6);

    } else if ($length == 18) { //如果是18位身份证

        //基本格式校验
        if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {
            return false;
        }
        // 省市县（6位）
        $areaNum = substr($num, 0, 6);
        // 出生年月日（8位）
        $dateNum = substr($num, 6, 8);

    } else { //假身份证
        return false;
    }

    //验证地区
    if (!isAreaCodeValid($areaNum)) {
        return false;
    }

    //验证日期
    if (!isDateValid($dateNum)) {
        return false;
    }

    //验证最后一位
    if (!isVerifyCodeValid($num)) {
        return false;
    }

    return true;
}

/**
 * 省市自治区校验
 * @param string $area 省、直辖市代码
 * @return bool
 */
function isAreaCodeValid($area) {
    $provinceCode = substr($area, 0, 2);

    // 根据GB/T2260—999，省市代码11到65
    if (11 <= $provinceCode && $provinceCode <= 65) {
        return true;
    } else {
        return false;
    }
}


/**
 * 验证出生日期合法性
 * @param string $date 日期
 * @return bool
 */
function isDateValid($date) {
    if (strlen($date) == 6) { //15位身份证号没有年份，这里拼上年份
        $date = '19'.$date;
    }
    $year  = intval(substr($date, 0, 4));
    $month = intval(substr($date, 4, 2));
    $day   = intval(substr($date, 6, 2));

    //日期基本格式校验
    if (!checkdate($month, $day, $year)) {
        return false;
    }

    //日期格式正确，但是逻辑存在问题(如:年份大于当前年)
    $currYear = date('Y');
    if ($year > $currYear) {
        return false;
    }
    return true;
}

/**
 * 验证18位身份证最后一位
 * @param string $num 待校验的身份证号
 * @return bool
 */
function isVerifyCodeValid($num)
{
    if (strlen($num) == 18) {
        $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        $tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

        $checkSum = 0;
        for ($i = 0; $i < 17; $i++) {
            $checkSum += intval($num{$i}) * $factor[$i];
        }

        $mod   = $checkSum % 11;
        $token = $tokens[$mod];

        $lastChar = strtoupper($num{17});

        if ($lastChar != $token) {
            return false;
        }
    }
    return true;
}

// 多维转一维
function arrToOne($multi) {

    $arr = array();

    foreach ($multi as $key => $val) {

        if( is_array($val) ) {

            $arr = array_merge($arr, arrToOne($val));

        } else {

            $arr[] = $val;

        }

    }

    return $arr;

}

/**
 * 获取session_key
 * @param $code
 * @return array|mixed
 */
function sessionKey($code)
{
    // 拼接url
    $grant_type = 'authorization_code';
    $url = "https://api.weixin.qq.com/sns/jscode2session?"."appid=".config('appid')."&secret=".config('app_secret')."&js_code=".$code."&grant_type=".$grant_type;
    $result = json_decode(httpGet($url),true);
    if (isset($result['errcode'])) {
        // $this->error = $result['errmsg'];
        return false;
    }
    return $result;
}

/**

* [std_class_object_to_array 将对象转成数组]

* @param [stdclass] $stdclassobject [对象]

* @return [array] [数组]

*/

function std_class_object_to_array($stdclassobject)
{

    $_array = is_object($stdclassobject) ? get_object_vars($stdclassobject) : $stdclassobject;

    foreach ($_array as $key => $value) {

    $value = (is_array($value) || is_object($value)) ? std_class_object_to_array($value) : $value;

    $array[$key] = $value;

    }

    return $array;

}

// 随机昵称
function createNickname()
{
    $randomXing = array('快乐的', '冷静的', '醉熏的', '潇洒的', '糊涂的', '积极的', '冷酷的', '深情的', '粗暴的', '温柔的', '可爱的', '愉快的', '义气的', '认真的', '威武的', '帅气的', '传统的', '潇洒的', '漂亮的', '自然的', '专一的', '听话的', '昏睡的', '狂野的', '等待的', '搞怪的', '幽默的', '魁梧的', '活泼的', '开心的', '高兴的', '超帅的', '留胡子的', '坦率的', '直率的', '轻松的', '痴情的', '完美的', '精明的', '无聊的', '有魅力的', '丰富的', '繁荣的', '饱满的', '炙热的', '暴躁的', '碧蓝的', '俊逸的', '英勇的', '健忘的', '故意的', '无心的', '土豪的', '朴实的', '兴奋的', '幸福的', '淡定的', '不安的', '阔达的', '孤独的', '独特的', '疯狂的', '时尚的', '落后的', '风趣的', '忧伤的', '大胆的', '爱笑的', '矮小的', '健康的', '合适的', '玩命的', '沉默的', '斯文的', '香蕉', '苹果', '鲤鱼', '鳗鱼', '任性的', '细心的', '粗心的', '大意的', '甜甜的', '酷酷的', '健壮的', '英俊的', '霸气的', '阳光的', '默默的', '大力的', '孝顺的', '忧虑的', '着急的', '紧张的', '善良的', '凶狠的', '害怕的', '重要的', '危机的', '欢喜的', '欣慰的', '满意的', '跳跃的', '诚心的', '称心的', '如意的', '怡然的', '娇气的', '无奈的', '无语的', '激动的', '愤怒的', '美好的', '感动的', '激情的', '激昂的', '震动的', '虚拟的', '超级的', '寒冷的', '精明的', '明理的', '犹豫的', '忧郁的', '寂寞的', '奋斗的', '勤奋的', '现代的', '过时的', '稳重的', '热情的', '含蓄的', '开放的', '无辜的', '多情的', '纯真的', '拉长的', '热心的', '从容的', '体贴的', '风中的', '曾经的', '追寻的', '儒雅的', '优雅的', '开朗的', '外向的', '内向的', '清爽的', '文艺的', '长情的', '平常的', '单身的', '伶俐的', '高大的', '懦弱的', '柔弱的', '爱笑的', '乐观的', '耍酷的', '酷炫的', '神勇的', '年轻的', '唠叨的', '瘦瘦的', '无情的', '包容的', '顺心的', '畅快的', '舒适的', '靓丽的', '负责的', '背后的', '简单的', '谦让的', '彩色的', '缥缈的', '欢呼的', '生动的', '复杂的', '慈祥的', '仁爱的', '魔幻的', '虚幻的', '淡然的', '受伤的', '雪白的', '高高的', '糟糕的', '顺利的', '闪闪的', '羞涩的', '缓慢的', '迅速的', '优秀的', '聪明的', '含糊的', '俏皮的', '淡淡的', '坚强的', '平淡的', '欣喜的', '能干的', '灵巧的', '友好的', '机智的', '机灵的', '正直的', '谨慎的', '俭朴的', '殷勤的', '虚心的', '辛勤的', '自觉的', '无私的', '无限的', '踏实的', '老实的', '现实的', '可靠的', '务实的', '拼搏的', '个性的', '粗犷的', '活力的', '成就的', '勤劳的', '单纯的', '落寞的', '朴素的', '悲凉的', '忧心的', '洁净的', '清秀的', '自由的', '小巧的', '单薄的', '贪玩的', '刻苦的', '干净的', '壮观的', '和谐的', '文静的', '调皮的', '害羞的', '安详的', '自信的', '端庄的', '坚定的', '美满的', '舒心的', '温暖的', '专注的', '勤恳的', '美丽的', '腼腆的', '优美的', '甜美的', '甜蜜的', '整齐的', '动人的', '典雅的', '尊敬的', '舒服的', '妩媚的', '秀丽的', '喜悦的', '甜美的', '彪壮的', '强健的', '大方的', '俊秀的', '聪慧的', '迷人的', '陶醉的', '悦耳的', '动听的', '明亮的', '结实的', '魁梧的', '标致的', '清脆的', '敏感的', '光亮的', '大气的', '老迟到的', '知性的', '冷傲的', '呆萌的', '野性的', '隐形的', '笑点低的', '微笑的', '笨笨的', '难过的', '沉静的', '火星上的', '失眠的', '安静的', '纯情的', '要减肥的', '迷路的', '烂漫的', '哭泣的', '贤惠的', '苗条的', '温婉的', '发嗲的', '会撒娇的', '贪玩的', '执着的', '眯眯眼的', '花痴的', '想人陪的', '眼睛大的', '高贵的', '傲娇的', '心灵美的', '爱撒娇的', '细腻的', '天真的', '怕黑的', '感性的', '飘逸的', '怕孤独的', '忐忑的', '高挑的', '傻傻的', '冷艳的', '爱听歌的', '还单身的', '怕孤单的', '懵懂的');
 
    $randomMing = array('嚓茶', '凉面', '便当', '毛豆', '花生', '可乐', '灯泡', '哈密瓜', '野狼', '背包', '眼神', '缘分', '雪碧', '人生', '牛排', '蚂蚁', '飞鸟', '灰狼', '斑马', '汉堡', '悟空', '巨人', '绿茶', '自行车', '保温杯', '大碗', '墨镜', '魔镜', '煎饼', '月饼', '月亮', '星星', '芝麻', '啤酒', '玫瑰', '大叔', '小伙', '哈密瓜，数据线', '太阳', '树叶', '芹菜', '黄蜂', '蜜粉', '蜜蜂', '信封', '西装', '外套', '裙子', '大象', '猫咪', '母鸡', '路灯', '蓝天', '白云', '星月', '彩虹', '微笑', '摩托', '板栗', '高山', '大地', '大树', '电灯胆', '砖头', '楼房', '水池', '鸡翅', '蜻蜓', '红牛', '咖啡', '机器猫', '枕头', '大船', '诺言', '钢笔', '刺猬', '天空', '飞机', '大炮', '冬天', '洋葱', '春天', '夏天', '秋天', '冬日', '航空', '毛衣', '豌豆', '黑米', '玉米', '眼睛', '老鼠', '白羊', '帅哥', '美女', '季节', '鲜花', '服饰', '裙子', '白开水', '秀发', '大山', '火车', '汽车', '歌曲', '舞蹈', '老师', '导师', '方盒', '大米', '麦片', '水杯', '水壶', '手套', '鞋子', '自行车', '鼠标', '手机', '电脑', '书本', '奇迹', '身影', '香烟', '夕阳', '台灯', '宝贝', '未来', '皮带', '钥匙', '心锁', '故事', '花瓣', '滑板', '画笔', '画板', '学姐', '店员', '电源', '饼干', '宝马', '过客', '大白', '时光', '石头', '钻石', '河马', '犀牛', '西牛', '绿草', '抽屉', '柜子', '往事', '寒风', '路人', '橘子', '耳机', '鸵鸟', '朋友', '苗条', '铅笔', '钢笔', '硬币', '热狗', '大侠', '御姐', '萝莉', '毛巾', '期待', '盼望', '白昼', '黑夜', '大门', '黑裤', '钢铁侠', '哑铃', '板凳', '枫叶', '荷花', '乌龟', '仙人掌', '衬衫', '大神', '草丛', '早晨', '心情', '茉莉', '流沙', '蜗牛', '战斗机', '冥王星', '猎豹', '棒球', '篮球', '乐曲', '电话', '网络', '世界', '中心', '鱼', '鸡', '狗', '老虎', '鸭子', '雨', '羽毛', '翅膀', '外套', '火', '丝袜', '书包', '钢笔', '冷风', '八宝粥', '烤鸡', '大雁', '音响', '招牌', '胡萝卜', '冰棍', '帽子', '菠萝', '蛋挞', '香水', '泥猴桃', '吐司', '溪流', '黄豆', '樱桃', '小鸽子', '小蝴蝶', '爆米花', '花卷', '小鸭子', '小海豚', '日记本', '小熊猫', '小懒猪', '小懒虫', '荔枝', '镜子', '曲奇', '金针菇', '小松鼠', '小虾米', '酒窝', '紫菜', '金鱼', '柚子', '果汁', '百褶裙', '项链', '帆布鞋', '火龙果', '奇异果', '煎蛋', '唇彩', '小土豆', '高跟鞋', '戒指', '雪糕', '睫毛', '铃铛', '手链', '香氛', '红酒', '月光', '酸奶', '银耳汤', '咖啡豆', '小蜜蜂', '小蚂蚁', '蜡烛', '棉花糖', '向日葵', '水蜜桃', '小蝴蝶', '小刺猬', '小丸子', '指甲油', '康乃馨', '糖豆', '薯片', '口红', '超短裙', '乌冬面', '冰淇淋', '棒棒糖', '长颈鹿', '豆芽', '发箍', '发卡', '发夹', '发带', '铃铛', '小馒头', '小笼包', '小甜瓜', '冬瓜', '香菇', '小兔子', '含羞草', '短靴', '睫毛膏', '小蘑菇', '跳跳糖', '小白菜', '草莓', '柠檬', '月饼', '百合', '纸鹤', '小天鹅', '云朵', '芒果', '面包', '海燕', '小猫咪', '龙猫', '唇膏', '鞋垫', '羊', '黑猫', '白猫', '万宝路', '金毛', '山水', '音响');
 
    $nicName = $randomXing[rand(0, count($randomXing) - 1)] . $randomMing[rand(0, count($randomMing) - 1)];
 
    return $nicName; // 返回生成的昵称
}





